#include "wifiserial.h"
#include "humidity.h"
#include "ui_wifiserial.h"
#include <QFile>
#include <QTextStream>
#include <QByteArray>
#include <fcntl.h>
#include <sys/ioctl.h>

#include <unistd.h>
QSerialPort *serial3 = nullptr;
int timerID = 0;
int imageID = 0;
bool sendFlag = false;
bool timeFlag = true;
bool imageReadFlag = false;
bool imageWriteFlag = false;
bool LEDFlag = false;
bool saveIP = false;
bool sendIP = false;

QString ip_data;
#define TEST_MAGIC 'x' // 定义幻数
#define TEST_MAX_NR 2  // 定义命令的最大序数

#define LED1 _IO(TEST_MAGIC, 0)
#define LED2 _IO(TEST_MAGIC, 1)
#define LED3 _IO(TEST_MAGIC, 2)
#define LED4 _IO(TEST_MAGIC, 3)
int led_fd = -1;
WIFIserial::WIFIserial(QWidget *parent) : QWidget(parent),
                                          ui(new Ui::WIFIserial)
{

    ui->setupUi(this);
    // 连接串行端口的 readyRead 信号到 readSerial3 槽函数
    connect(serial3, SIGNAL(readyRead()), this, SLOT(readSerial3()));

    ui->ssid_in->setText("1");

    ui->password_in->setText("11111111");

    ui->ip_in->setText("192.168.43.32");

    ui->port_in->setText("8080");

    led_fd = ::open("/dev/Led", O_RDWR);
    if (led_fd < 0)
    {
        qDebug("open led dev fail!!");
    }
}

WIFIserial::~WIFIserial()
{
    if (led_fd > 0)
    {
        ::close(led_fd);
        led_fd = -1;
    }
    delete ui;
}

void WIFIserial::on_goback_clicked()
{
    emit goback();
}

// 从串行端口读取数据的槽函数
void WIFIserial::readSerial3()
{
    // 读取所有可用的数据
    QByteArray data = serial3->readAll();

    if (!data.isEmpty())
    {
        // 将接收到的数据显示在文本编辑器中
        ui->reception->append("8266 返回: " + data);

        // 解析数据
        parseData(data);
    }
}
// void WIFIserial::readSerial3()
// {
//     // 读取所有可用的数据
//     QByteArray data = serial3->readAll();
//     if (!data.isEmpty())
//     {
//         // 将接收到的数据显示在文本编辑器中
//         ui->reception->append("8266 返回: " + data);
//     }
// }
// 定时器事件处理函数
void WIFIserial::timerEvent(QTimerEvent *event)
{
    readSerial3();
    QString message;
    if (imageID == 0)
        imageWriteFlag = true;
    imageID++;
    if (imageID == 6)
    {
        imageID = 0;
    }

    if (sendFlag)
    {
        if (imageReadFlag)
        {
            QString imagePath = "./image.jpeg";

            sendJPEGImage(imagePath);
        }
    }

    if (LEDFlag)
    {
        ::ioctl(led_fd, LED1, 0);
        ::ioctl(led_fd, LED2, 0);
        ::ioctl(led_fd, LED3, 0);
        ::ioctl(led_fd, LED4, 0);
    }
    else
    {
        ::ioctl(led_fd, LED1, 1);
        ::ioctl(led_fd, LED2, 1);
        ::ioctl(led_fd, LED3, 1);
        ::ioctl(led_fd, LED4, 1);
    }
}

// 设置
void WIFIserial::on_setSAT_clicked()
{
    // 获取用户输入的SSID、密码、IP和端口号
    ssid = ui->ssid_in->text();
    password = ui->password_in->text();
    IP = ui->ip_in->text();
    Port = ui->port_in->text();

    // mode   sta
    serial3->write("AT+CWMODE=1\r\n");
    waitForResponse();

    serial3->write("AT+RST\r\n");
    waitForResponse();

    // 连接到 Wi-Fi 网络
    QString command = QString("AT+CWJAP=\"%1\",\"%2\"\r\n").arg(ssid, password);

    serial3->write(command.toUtf8());
    waitForResponse();

    serial3->write("AT+RST\r\n");
    waitForResponse();
    // 设置单连接模式
    serial3->write("AT+CIPMUX=0\r\n");
    waitForResponse();

    //    // 启动 TCP 连接
    //    command = QString("AT+CIPSTART=\"TCP\",\"%1\",%2\r\n").arg(IP, Port);

    //    serial3->write(command.toUtf8());
    //    waitForResponse();
    //    waitForResponse();

    //    // 设置透传模式
    //    serial3->write("AT+CIPMODE=1\r\n");
    //    waitForResponse();

    //    serial3->write("AT+CIPSEND\r\n");
    //    waitForResponse();
}

// 重启按键
void WIFIserial::on_reset_clicked()
{
    serial3->write("AT+RST\r\n");
}
// 结束（理论上）
void WIFIserial::on_endSend_clicked()
{
    sendFlag = false;
    waitForResponse();
    serial3->write("+++\r\n");
    // waitForResponse();
    // serial3->write("AT+CIPMODE=0\r\n");
}

// 开启状态显示
void WIFIserial::on_start_clicked()
{
    if (timeFlag)
    {
        this->killTimer(timerID);
        ui->start->setText("准备开始");
        timeFlag = false;
    }

    else
    {
        timerID = this->startTimer(600);
        ui->start->setText("停止8266");
        timeFlag = true;
    }
}

void WIFIserial::on_send_clicked()
{
    if (sendFlag)
    {
        sendFlag = false;
        ui->send->setText("发送");
    }
    else
    {
        sendFlag = true;
        ui->send->setText("停止发送");
    }
}
void WIFIserial::on_IP_clicked()
{
    serial3->write("AT+CIFSR\r\n");
    saveIP = true;
    waitForResponse();
}
// 延时
void WIFIserial::waitForResponse()
{
    // 等待模块响应，这里等待2秒
    const int timeout = 2000; // 2000毫秒
    QEventLoop loop;
    QTimer timer;
    QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);
    timer.start(timeout);
    loop.exec(); // 等待响应或超时

    // 检查响应，确保模块返回了OK
    QString response = serial3->readAll();
    if (response.contains("OK") || response.contains("ALREADY CONNECT"))
    {
        // 处理成功的响应
    }
    else if (response.contains("ERROR"))
    {
        // 处理错误响应
    }
    else
    {
        // 处理无响应或未知响应
    }
}

// 重新尝试TCP部分
void WIFIserial::on_rst_tcp_clicked()
{
    IP = ui->ip_in->text();
    Port = ui->port_in->text();
    QString command = QString("AT+CIPSTART=\"TCP\",\"%1\",%2\r\n").arg(IP, Port);

    serial3->write(command.toUtf8());
    waitForResponse();
    waitForResponse();

    // 设置透传模式
    serial3->write("AT+CIPMODE=1\r\n");
    waitForResponse();

    serial3->write("AT+CIPSEND\r\n");
    waitForResponse();
}

// 发送JPEG图片的函数，改了一下还负责发送数据了
void WIFIserial::sendJPEGImage(const QString &filePath)
{
    // 确保WiFi连接已经建立
    if (!serial3->isOpen())
    {
        // 处理串口未打开的情况
        return;
    }

    QString message = QString("1\r\n");
    serial3->write(message.toUtf8());
    message = QString("temp=%1 ,hum=%2 ,distance=%3 ,light=%4\r\n").arg(tmpData).arg(humData).arg(distanceData).arg(lightData);
    serial3->write(ip_data.toUtf8());
    serial3->write(message.toUtf8());
    message = QString("2\r\n");
    serial3->write(message.toUtf8());

    // 打开JPEG文件
    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly))
    {
        // 处理文件打开失败
        return;
    }

    // 读取文件大小
    qint64 fileSize = file.size();

    // 读取文件内容并发送
    QByteArray block;
    while (!file.atEnd())
    {
        block = file.read(1024);
        // serial3->write(block.toUtf8());
        serial3->write(block);
    }
    file.close();
    imageReadFlag = false;
}

void WIFIserial::parseData(const QByteArray &data)
{
    QString strData = QString::fromUtf8(data);

    QRegExp openLEDRegExp("OPENLED");
    QRegExp closeLEDRegExp("CLOSELED");
    if (saveIP)
    {
        ip_data = strData;
        qDebug() << "Data:" << ip_data;
        sendIP = true;
        saveIP = false;
    }
    if (openLEDRegExp.indexIn(strData) != -1)
    {
        ui->reception->append("打开LED");
        LEDFlag = true;
    }
    else if (closeLEDRegExp.indexIn(strData) != -1)
    {
        ui->reception->append("关闭LED");
        LEDFlag = false;
    }
}
